package leetcode006;

/**
 * Z 字形变换
 * https://leetcode.cn/problems/zigzag-conversion/description/
 *
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
 *
 * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：
 *
 * P   A   H   N
 * A P L S I I G
 * Y   I   R
 * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
 *
 * 请你实现这个将字符串进行指定行数变换的函数：
 *
 * string convert(string s, int numRows);
 */
public class Study006 {

    public String convert(String s, int numRows) {
        //字符长度
        int len = s.length();
        if (numRows == 1 || numRows >= len) return s;

        //每一轮的字符数量
        int stepChartNum = numRows + numRows - 2;
        //每一轮占用的列数
        int stepCellNum = 1 + numRows - 2;
        //总共需要多少轮
        int stepNum = len / stepChartNum + (len % stepChartNum > 0 ? 1 : 0);
        int cellNum = stepNum * stepCellNum;
        if (len % stepChartNum > 0 & len % stepChartNum <= numRows) {
            cellNum += 1;
        } else if (len % stepChartNum > numRows) {
            cellNum += len % stepChartNum;
        }

        char[][] ch = new char[numRows][cellNum];
        int cell = 0;
        int row = 0;
        for (int i = 0; i < len; i++) {
            char c = s.charAt(i);
            ch[row][cell] = c;
            if ( i % stepChartNum < numRows - 1) {
                row++;
            } else {
                row--;
                cell++;
            }

        }
        StringBuilder sb = new StringBuilder();
        for (char[] chars : ch) {
            for (char c : chars) {
//                System.out.println(c);
                if (c != 0) {
                    sb.append(c);
                }
            }
        }
        return sb.toString();
    }

    public String convert2(String s, int numRows) {
        //字符长度
        int len = s.length();
        //只有一行或者行数大于字符串长度的情况直接返回原字符串。
        // 这两种情况要提前单独处理，不然会是后面的代码报错。
        if (numRows == 1 || numRows >= len){
            return s;
        }
//        char[] sb = new char[len];
//        int index = 0;
        //一个周期内有多少字符数
        int stepChartNum = numRows + numRows - 2;
        StringBuilder sb = new StringBuilder();
        //处理第一行
        for (int i = 0; stepChartNum * i < len; i++) {
            sb.append(s.charAt(stepChartNum * i));
//            index++;
        }
        //按行循环，除了第一行和最后一行
        for ( int i = 1; i < numRows - 1; i++ ) {
            for ( int j = 0; j * stepChartNum + i < len || j * stepChartNum + (stepChartNum - i) < len; j++ ) {
                sb.append(s.charAt(j * stepChartNum + i));
//                index++;
                if (j * stepChartNum + (stepChartNum - i) < len) {
                    sb.append(s.charAt(j * stepChartNum + (stepChartNum - i)));
//                    index++;
                }
            }
        }
        //处理最后一行
        for (int i = 0; i * stepChartNum + numRows - 1 < len; i++) {
            sb.append(s.charAt(i * stepChartNum + numRows - 1));
//            index++;
        }
        return new String(sb);
    }


    public static void main(String[] args) {
        Study006 study006 = new Study006();
        System.out.println(study006.convert2("PAYPALISHIRING", 4));
        System.out.println(study006.convert2("A", 1));
    }
}
